/**
 * This software is distributed under the terms of the MIT License.
 * Copyright (c) 2020 CrobTech.
 * Author: Jason Zhu
 * Contributors: https://gitee.com/JasonZhu2021/tmf8801_tof_demo
 */

/**************************************************************************************
 * INCLUDE
 **************************************************************************************/
#include "TMF8801_Reg.h"

/**************************************************************************************
 * Register Read & Write Function
 **************************************************************************************/
/**
 * @brief  write a byte to register 向寄存器写一个字节
 * @param  ctx              io device	读写io控制对象
 * @param  reg              register address 寄存器地址
 * @param  data             write date 写入的数据
 * @return int32_t 					io status io 操作的状态
 */
int32_t tmf8801_write_reg(tmf8801_ctx_t *ctx, uint8_t reg, uint8_t data)
{
  int32_t ret;
  uint8_t reg_val = data;
  ret = ctx->write_reg(ctx->handle, reg, &reg_val, 1U);
  return ret;
}
/**
 * @brief  read a byte from register 从寄存器读一个字节
 * @param  ctx              io device	读写io控制对象
 * @param  reg              register address 寄存器地址
 * @param  data             read date address 待读取的数据缓冲地址
 * @return int32_t 					io status io 操作的状态
 */
int32_t tmf8801_read_reg(tmf8801_ctx_t *ctx, uint8_t reg, uint8_t *data)
{
  int32_t ret;
  ret = ctx->read_reg(ctx->handle, reg, data, 1U);
  return ret;
}
/**
 * @brief write a bit to register 向寄存器某一位写数据
 * @param  ctx              io device	读写io控制对象
 * @param  reg              register address 寄存器地址
 * @param  bitmask          位掩码
 * @param  val              bit val 写入值 1 or 0
 * @return int32_t 					io status io 操作的状态
 */
int32_t tmf8801_modify_reg(tmf8801_ctx_t *ctx, uint8_t reg, uint8_t const bitmask, uint8_t const val)
{
  int32_t ret;
  uint8_t reg_val;
  ret = ctx->read_reg(ctx->handle, reg, &reg_val, 1U);
  if(ret != 0)
          return ret;
  reg_val &= ~(bitmask);
  val ? reg_val |= bitmask : reg_val;
  ret = ctx->write_reg(ctx->handle, reg, &reg_val, 1U);
  return ret;
}
/**
 * @brief read a bit from register 从寄存器读取某一位状态
 * @param  ctx              io device	读写io控制对象
 * @param  reg              doc
 * @param  bitpos           位位置
 * @return int32_t 					位状态
 */
int32_t tmf8801_is_bit_set(tmf8801_ctx_t *ctx, uint8_t reg, uint8_t const bitpos)
{
  uint8_t reg_val;
  ctx->read_reg(ctx->handle, reg, &reg_val, 1);
  if (reg_val & (1 << bitpos))
      return BIT_SET;
  else
      return BIT_RESET;
}
/**************************************************************************************
 * Extra Functions
 **************************************************************************************/
/**
 * @brief 									获取tmf8801的id号
 * @param  ctx              io device	读写io控制对象
 * @param  buf              id 存放的地址
 * @return int32_t 					io status io 操作的状态
 */
int32_t tmf8801_device_id_get(tmf8801_ctx_t *ctx, uint8_t *buf)
{
  return tmf8801_read_reg(ctx, TMF8801_WHO_AM_I, buf);
}
/**
 * @brief 									复位tmf8801
 * @param  ctx              io device	读写io控制对象
 * @return int32_t 					io status io 操作的状态
 */
int32_t tmf8801_device_reset(tmf8801_ctx_t *ctx)
{
  return tmf8801_modify_reg(ctx, TMF8801_ENABLE, (1 << TMF8801_CPU_RESET), BIT_SET);
}
/**
 * @brief 									获取芯片CPU状态
 * @param  ctx              io device	读写io控制对象
 * @return int32_t 					io status io 操作的状态
 */
int32_t tmf8801_is_cpu_ready(tmf8801_ctx_t *ctx)
{
  return tmf8801_is_bit_set(ctx, TMF8801_ENABLE, TMF8801_CPU_READY);
}
/**
 * @brief 									获取芯片运行状态
 * @param  ctx              io device	读写io控制对象
 * @return int32_t 					io status io 操作的状态
 */
int32_t tmf8801_is_app_ready(tmf8801_ctx_t *ctx)
{
  uint8_t appid_val;
  ctx->read_reg(ctx->handle, TMF8801_APPID, &appid_val, 1U);
  if(appid_val == TMF8801_APP)
  {
          return APP_SUCCESS;
  }
  else if(appid_val == BOOT_SUCCESS)
  {
          return BOOT_SUCCESS;
  }
  else
  {
          return UNKNOWN;
  }
}
/**
 * @brief 									获取测量数据
 * @param  ctx              io device	读写io控制对象
 * @param  pData            读取的数据存放地址
 * @return int32_t 					io status io 操作的状态
 */
int32_t tmf8801_read_detection_result(tmf8801_ctx_t *ctx, uint8_t *pData)
{
  return ctx->read_reg(ctx->handle, RESULT_NUMBER, pData, 4U);
}
/**
 * @brief 									加载校准数据
 * @param  ctx              io device	读写io控制对象
 * @param  pData            加载的数据存放地址
 * @param  size             数据长度
 * @return int32_t 					io status io 操作的状态
 */
int32_t tmf8801_load_calibdata(tmf8801_ctx_t *ctx, uint8_t *pData, uint16_t size)
{
  return ctx->write_reg(ctx->handle, FACTORY_CALIB_0, pData, size);
}
/**
 * @brief 									加载...
 * @param  ctx              io device	读写io控制对象
 * @param  pData            加载的数据存放地址
 * @param  size             数据长度
 * @return int32_t 					io status io 操作的状态
 */
int32_t tmf8801_load_algostate(tmf8801_ctx_t *ctx, uint8_t *pData, uint16_t size)
{
  return ctx->write_reg(ctx->handle, STATE_DATA_WR_0, pData, size);
}
/**************************************************************************************
 * NAMESPACE
 **************************************************************************************/

 /* TMF8801 */
